package com.tiance.demo.service.mysql.bo.pageindex;

import com.tiance.demo.service.mysql.utils.ByteUtils;

/**
 * 索引页的页头
 */
public class IndexPageHeader {

    /**
     * 一个页头是56字节
     */
    public static final int SIZE = 56;

    private byte[] bytes;

    /**
     * 序列1 <br />
     * 2字节, 起始于: 0字节<br />
     * 在页目录的槽数量
     */
    private int nDirSlots;

    /**
     * 序列2 <br />
     * 2字节, 起始于: 2字节<br />
     * 还未使用的空间最小地址，也就是说从该地址之后就是Free Space
     */
    private int heapTop;

    /**
     * 序列3 <br />
     * 2字节, 起始于: 4字节<br />
     * 本页中的记录的数量（包括最小和最大记录以及标记为删除的记录）
     */
    private int nHeap;

    /**
     * 序列4 <br />
     * 2字节, 起始于: 6字节<br />
     * 第一个已经标记为删除的记录地址（各个已删除的记录通过next_record也会组成一个单链表，这个单链表中的记录可以被重新利用）
     */
    private int free;

    /**
     * 序列5 <br />
     * 2字节, 起始于: 8字节<br />
     * 已删除记录占用的字节数
     */
    private int garbage;

    /**
     * 序列6 <br />
     * 2字节, 起始于: 10字节<br />
     * 最后插入记录的位置
     */
    private int lastInsert;

    /**
     * 序列7 <br />
     * 2字节, 起始于: 12字节<br />
     * 记录插入的方向
     */
    private int direction;

    /**
     * 序列8 <br />
     * 2字节, 起始于: 14字节<br />
     * 一个方向连续插入的记录数量
     */
    private int nDirection;

    /**
     * 序列9 <br />
     * 2字节, 起始于: 16字节<br />
     * 该页中记录的数量（不包括最小和最大记录以及被标记为删除的记录）
     */
    private int nRecs;

    /**
     * 序列10 <br />
     * 8字节, 起始于: 18字节<br />
     * 修改当前页的最大事务ID，该值仅在二级索引中定义
     */
    private String maxTransactionId;

    /**
     * 序列11 <br />
     * 2字节, 起始于: 26字节<br />
     * 当前页在B+树中所处的层级
     */
    private int level;

    /**
     * 序列12 <br />
     * 8字节, 起始于: 28字节<br />
     * 索引ID，表示当前页属于哪个索引
     */
    private String indexId;

    /**
     * 序列13 <br />
     * 10字节, 起始于: 36字节<br />
     * B+树叶子段的头部信息，仅在B+树的Root页定义
     */
    private String btrSegleaf;

    /**
     * 序列14 <br />
     * 10字节, 起始于: 46字节<br />
     * B+树非叶子段的头部信息，仅在B+树的Root页定义
     */
    private String btrSegTop;

    public byte[] getBytes() {
        return bytes;
    }

    public void setBytes(byte[] bytes) {
        this.bytes = bytes;
    }

    public int getnDirSlots() {
        return nDirSlots;
    }

    public void setnDirSlots(int nDirSlots) {
        this.nDirSlots = nDirSlots;
    }

    public int getHeapTop() {
        return heapTop;
    }

    public void setHeapTop(int heapTop) {
        this.heapTop = heapTop;
    }

    public int getnHeap() {
        return nHeap;
    }

    public void setnHeap(int nHeap) {
        this.nHeap = nHeap;
    }

    public int getFree() {
        return free;
    }

    public void setFree(int free) {
        this.free = free;
    }

    public int getGarbage() {
        return garbage;
    }

    public void setGarbage(int garbage) {
        this.garbage = garbage;
    }

    public int getLastInsert() {
        return lastInsert;
    }

    public void setLastInsert(int lastInsert) {
        this.lastInsert = lastInsert;
    }

    public int getDirection() {
        return direction;
    }

    public void setDirection(int direction) {
        this.direction = direction;
    }

    public int getnDirection() {
        return nDirection;
    }

    public void setnDirection(int nDirection) {
        this.nDirection = nDirection;
    }

    public int getnRecs() {
        return nRecs;
    }

    public void setnRecs(int nRecs) {
        this.nRecs = nRecs;
    }

    public String getMaxTransactionId() {
        return maxTransactionId;
    }

    public void setMaxTransactionId(String maxTransactionId) {
        this.maxTransactionId = maxTransactionId;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public String getIndexId() {
        return indexId;
    }

    public void setIndexId(String indexId) {
        this.indexId = indexId;
    }

    public String getBtrSegleaf() {
        return btrSegleaf;
    }

    public void setBtrSegleaf(String btrSegleaf) {
        this.btrSegleaf = btrSegleaf;
    }

    public String getBtrSegTop() {
        return btrSegTop;
    }

    public void setBtrSegTop(String btrSegTop) {
        this.btrSegTop = btrSegTop;
    }

    @Override
    public String toString() {
        return "PageHeader:\n" +
                "bytes=" + ByteUtils.bytes2HexStr(bytes) +
                "\nnDirSlots=" + nDirSlots +
                ", heapTop=" + heapTop +
                ", nHeap=" + nHeap +
                ", free=" + free +
                ", garbage=" + garbage +
                ", lastInsert=" + lastInsert +
                ", direction=" + direction +
                ", nDirection=" + nDirection +
                ", nRecs=" + nRecs +
                ", maxTransactionId='" + maxTransactionId + '\'' +
                ", level=" + level +
                ", indexId='" + indexId + '\'' +
                ", btrSegleaf='" + btrSegleaf + '\'' +
                ", btrSegTop='" + btrSegTop + '\'' +
                '}';
    }
}
